Club-80 Terminal auf Basis der Hercules-Karte des PC

Helmut Bernhardt, Stefan Nitschke			22.05.91


Nun ist es schon wieder 1 Jahr her, daß auf dem Club-Treffen 1990
der Bau einer Terminalkarte, die sich des günstigen Leistungs/Preis-
-Verhältnisses der Herculeskarte für den PC bedient, beschlossen
wurde. Nachdem ein erfolgsversprechendes Konzept stand, der Hardware-
-Koordinator noch schriftlich um Stellungnahme gebeten wurde (die
bislang immer noch nicht vorliegt), auf diese Stellungnahme artig ein
paar Wochen gewartet wurde, haben wir das damalige Konzept für das
Konzept an Jens Neueder abgeschickt. Wahrscheinlich erscheint es
zusammemen mit diesen Beiträgen irgendwann in den nächsten Jahren mal
in einem Info.

Da wir nicht warten wollten, bis eventuell mal ein Info erscheint und
dann eventuell doch noch mehr Mitstreiter bei dem Projekt helfen,
haben wir schon mal angefangen und eine lauffähige erste Version
fertiggestellt. An dem ursprünglichen Hardwarekonzept hat sich in-
zwischen nichts geändert und auch das, was als Software bislang
läuft, entspricht dem TVI950-Standard (mit den paar zusätzlichen und
sehr nützlichen Features wie z.B. Program-Download).

Da bleibt noch die Einbindung der Tektronix 4014 Grafikbefehle, des
Druckertreibers, eines Hardcopy-Befehls und einiger zusätzlicher
Befehle (u.a. Snapshot: Abspeichern des Bildschirminhalts auf Disk).
Diese recht umfangreichen Aufgaben stehen immer noch an.

Zusätzlich haben wir uns überlegt, daß man die 8 Text-Pages der Hercu-
leskarte dazu benutzen kann, um damit Window-Technik zu realisieren.
Durch einen Befehl werden dem Terminal die Kordinaten des oberen
linken Punktes sowie die Anzahl Zeilen und Spalten im Fenster mitge-
teilt. Das Terminal kopiert daraufhin die derzeitige Textseite in die
nächste, löscht darin den angegebenen Fensterbereich und positio-
niert den Cursor in der oberen linken Ecke des neuen Fensters. Der
Befehl 'Fenster löschen' schaltet einfach wieder zurück auf die vor-
herige Textseite. Nötige Statusinformationen werden in Window Control
Blocks für jede Fensterebene geführt, so daß nach dem Entfernen eines
Fensters der vorherige Bildschirm mit allen Einstellungen (Attribut,
Cursor) wieder restauriert wird. Das ist aber zur Zeit noch im Entste-
hen.

Das Terminal ist ein Z80-Computer mit 32k Arbeitsspeicher und 32K
Hercules-Video-RAM. Nach dem Einschalten besteht der Arbeitsspeicher
beim Lesen aus EPROM und beim Schreiben aus RAM. Durch ein LDIR wird
der EPROM-Inhalt bei der Initialisierung ins RAM kopiert. Danach wird
das EPROM abgeschaltet und beim Lesen und Schreiben in den unteren
32K erreicht der Z80 das RAM.

Die oberen 32K des Z80 sind dem Video-RAM der Hercules vorbehalten.
Hier können die beiden 32K HRG-Pages der Hercules bzw. das Text-/
Attribut-Video-RAM eingeblendet werden. Im Textmodus bietet die Hercu-
les-Karte 8 linear hintereinander liegende Seiten mir je 4K Text-/
Attribut-Speicher. Innerhalb einer Textseite stehen die gradzahligen
Adressen als Textspeicher und die ungradzahlignen Adressen als Spei-
cher für die zugehörigen Attribute zur Verfügung. Jeweils zwei Spei-
cheradressen stehen für eine Druckposition auf dem Bildschirm.

Die Bits eines Attributbytes haben folgende Funktion:
  D7 = 0  nicht blinkend bzw. normaler Hintergrund
  D7 = 1  blinkend bzw. halbheller Hintergrund
		(siehe D5 des Display Mode Control Ports B8h)
  D6-D4 = 0, D2-D0 = 1  normale Darstellung
  D6-D4 = 1, D2-D0 = 0  inverse Darstellung

Das gilt aus der Sicht des Z80, der den Speicher der Hercules mit
Zeichen und Attributen zu befüllen hat. Der CRTC6845 auf der Hercules
hat während der Darstellung eines Zeichens (bzw. der Dotzeile eines
Zeichens) gleichzeitig das Zeichen und Attribut auszulesen und während
des Shiftens der Bits zum Videosignal die Informationen des Attributs
auf das Videosignal wirken zu lassen. Für den 6845 ist eine Textseite
in 2K Worten organisiert - das ist bei der Berechnung des Inhalts des
Scan-Offset-Registers des 6845 zu berücksichtigen.

Im I/O-Adreßraum des Terminal-Z80 sind die Hercules-internen Ports,
das Interface zum Host-Computer, ein Latch zur Einstellung der Konfi-
guration des Terminals und ein Tastatur-Interface unterzubringen; als
da wären:

  00H	Status-Register des Interface zum Host-Computer
  01H	Daten-Register des Interface zum Host-Computer
  02H	Konfigurations-Latch
  03H	Tastatur-Datenregister
  B0H-BFH interne Ports der Hercules-Karte
   B4H	Adreßregister des CRTC-6845
   B5H	Datenregister des CRTC-6845
   B8H	Display-Mode-Control-Port der Hercules
	D1 = 0	Text-Video-Mode enabled, HRG disabled
	   = 1	HRG enabled, Text-Video disabled
	D3 = 0	die Hercules gibt kein Video-Signal an den Monitor
	   = 1	das Video-Signal der Karte gelangt zum Monitor
	D5 = 0	D7=1 des Attribut-Bytes bedeutet "heller Hintergrund"
	   = 1	D7=1 des Attribut-Bytes bedeutet "Blinken"
	D7 = 0	HRG: Page 0 selectet
	   = 1	HRG: Page 1 selected
   B9H	Display-Status-Kanal (nach mc)
   BAH	Display-Statusport (nach Computer 2000)
	D0 = 1	horizontaler Zeilenrücklauf
	D3 = 1	Video-Echo, Signal zum Monitor
	D7 = 0	vertikaler Strahlrücklauf
   BBH	Light-Pen Flip Flop zurücksetzen
		wird kaum noch in Hardware ermöglicht
   BCH	Drucker-Datenport (Schreiben)
   BDH	Drucker Statusport (Lesen)
	D3 = 0	Error
	D4 = 1	Selected & Ready
	D6 = 0	(für 5 Microsecs) /ACK low aktiv
	D7 = 1	Ready high aktiv
   BEH	Drucker-Steuerkanal
	D0 = 0	/STROBE, mindestens 5 Microsecs
	D1 = 1	Linefeed
	D2 = 0	Reset Printer, mindestens 50 Microsecs
	D3 = 1	Select, Drucker freigeben
	D4 = 1	IRQ7 (high aktiver Interrupt) freigeben,
		wenn der Drucker ein Byte übernommen hat
   BFH	Konfigurations-Schalter
	D0 = 1	HRG erlaubt, gilt nur für Page 0
	D1 = 1	auch HRG-Page 1 erlaubt

Das Konfigurations-Latch (Port 02h) unterstützt bislang die Befehle:
   OUT	(02H),0   Einschalten des Text-/Attribut-Speiches im Texmodus
		  bzw. der HRG-Seite 0 im Grafik-Modus
   OUT	(02H),1   Einschalten der HRG-Seite 1; im Text-Modus ist der
		  Text-Speicher nicht verfügbar
   OUT	(02H),2   im Bereich 0-32K ist bei Leseoperationen das EPROM
		  eingeblendet
   OUT	(02H),3   Sowohl beim Lesen als auch beim Schreiben liegt im
		  Bereich 0-32K RAM vor
   OUT	(02H),5   und danach...
   OUT	(02H),4   Zurücksetzen des Interface der PC-Tastatur

Die Ausgabe der Werte 6-15 kann für weitere Konfigurations-Einstel-
lungen benutzt werden. D0 gibt dabei jeweils den Pegel einer ent-
sprechenden Steuerleitung wieder (Q3-Q7 des 74LS259-Latch) und D1-D3
geben vor, welche Steuerleitung geschaltet werden soll. Auf der Karte
ist noch ein Lochrasterfeld frei, in dem entsprechende Hardware-Erwei-
terungen untergebracht werden können. U. a. erscheint es zweckmäßig zu
sein, Rabatz-I/O-Hardware unterzubringen, die über Q3 (mit den Steuer-
codes 06H/07H) zu löblichem Tun angeregt wird.

Zur Vereinfachung der Kommunikation zwischen Host und Terminal wird
am Terminal-Z80 ein Interrupt erzeugt, wenn der Host ein neues Datum
ausgegeben hat. Diese Technik erfordert in der Software-Entwicklung
zwar etwas mehr Sorgfalt, sie ermöglicht aber auch, daß der Z80 des
Terminals bei Konjunkturflauten mit anderen sinvollen Aufgaben be-
schäftigt werden kann und zwischendurch mal eben ein Byte vom Host
übernehmen und ins Fernsehen schicken kann.

Als Tastatur kann wahlweise eine 8Bit-ASCII-Paralleltastatur oder
eine serielle PC-Tastatur verwendet werden. Für den Anschluß einer
8Bit-ASCII-Paralleltastatur besteht ein 74LS244 Lesetreiber. Der
/STROBE-Eingang der Tastatur ist direkt an den /NMI-Pin des Z80 ange-
schlossen. Die Übernahme von Tastaturdaten erfolgt in Echtzeit im
Hintergrund. Alle Tastaturdaten werden in einem 32Byte-Ringpuffer
zwischengespeichert. Der Ringpuffer wird in der Hauptprogrammschleife
ständig überwacht und bei Bedarf werden die Tastatureingaben an den
Host entsorgt. Danach ist gewährleistet, daß keine Tastatureingaben
verlorengehen, und daß bei der Übertragung sonstiger Daten (z.B.
Bildschirmdump) an den Host nicht Tastaturdaten dazwischengeraten.
Während solcher Jobs befindet sich der Z80 nicht in der Hauptprogramm-
schleife.

Alternativ kann auch eine PC-Tastatur angeschlossen werden. Diese
Teile geben keine ASCII-Daten sondern Scancodes aus. Solch ein Scan-
code wird gesendet, wenn eine Taste gedrückt und auch wenn eine Taste
losgelassen wird. Make- und Break-Codes einer Taste unterscheiden
sich dabei nur durch D7 des übertragenen Bytes.

Die Codes der PC-Tastatur werden seriell mit TTL-Pegeln übertragen.
Zur Synchronisation liefert die Tastatur auch ein CLK-Signal. Auf der
Terminal-Karte besteht ein Seriell/Parallel-Wandler, der selbständig
die 8Bit der Tastatur sammelt und nach dem achten Bit einen /NMI
erzeugt. Der Z80 kann dann über den Port 03H den Scancode der Tasta-
tur als 8Bit-Wort auslesen und durch aufeinanderfolgende Ausgabe der
Werte 4 und 5 an Port 02H den Seriell/Parallel-Wandler für die näch-
ste Tastatureingabe zurücksetzen.

Die /NMI-Serviceroutine führt Buch über den Zustand der Tasten mit
Umschaltfunktionen und erzeugt mit diesen Informationen aus den Scan-
codes der normalen Tasten ASCII-Codes, die im Ringpuffer abgelegt
werden.

Wenn eine PC-Tastatur angeschlossen wird, braucht der 74LS244 nicht
bestückt zu werden, und wenn eine Paralleltastatur zum Einsatz kommt,
ist kein 74LS322 nötig. Durch den Jumper JP2 wird vorgegeben, welcher
Baustein aktiv sein soll.

JP2	1-2 gebrückt: Interface für eine PC-Tastatur
	2-3 gebrückt: Interface für eine Paralleltastatur

Bei Anschluß der PC-Tastatur muß außerdem JP3 gesteckt werden, damit
am Z80 ein /NMI ankommen kann.

Das Terminal ist mit dem Host über eine bidirektionale parallele
Schnittstelle verbunden. Für den Z80 des Terminals liegen die Adres-
sen des Ports des Interface fest (00H = Statusregister; 01H = Daten-
register) Durch Lesen des Statusregisters kann der Terminal-Z80
feststellen, ob er Daten entgegennehmen kann/muß bzw. ausgeben kann
bzw. muß:
   D0 = 0	es kann/muß ein weiteres Byte an den Host ausgegeben
		werden (der Host hat das letzte Byte abgeholt)
      = 1	es darf noch kein weiteres Byte an den Host ausgegeben
		werden.
   D7 = 0	es liegt kein neues Byte vom Host vor
      = 1	der Host hat ein neues Byte ausgegeben, das abgeholt
		werden muß

Die Portadressen, unter denen das Terminal für den Host-Computer
erreichbar sein soll, lassen sich über Jumper in Schritten von 4
beliebig einstellen. Die Basisadresse X+0 ist das Statusregister.

D6 des Statusregisters zeigt an, ob das Terminal ein weiteres Byte
annehmen kann:
   D6 = 1	das Terminal kann ein weiteres Byte annehmen
      = 0	es darf noch kein weiteres Byte an das Terminal
		ausgegeben werden

D7 gibt an, ob das Terminal bei der Ausgabe von Daten an den Host ein
neues Byte bereitgestellt hat:
   D7 = 1	es steht kein neues Byte des Terminals bereit
      = 0	das Terminal hat ein neues Byte ausgegeben

Je nach Zustand der Bits 6 und 7 des Statusports kann der Host an den
Datenport X+1 ein weiteres Byte ausgeben bzw. von dort ein weiteres
Byte abholen.

Über das Jumperfeld JP1 wird die Portadresse des Terminals eingestellt.
Die Jumper haben folgende Funktion:

 1 - 2 offen:			A7 der Portadresse ist high
       gesteckt:		A7 der Portadresse ist low
 3 - 4 offen:			A6 der Portadresse ist high
       gesteckt:		A6 der Portadresse ist low
 5 - 6 offen:			A5 der Portadresse ist high
       gesteckt:		A5 der Portadresse ist low
 7 - 8 offen:			A4 der Portadresse ist high
       gesteckt:		A4 der Portadresse ist low
11 - 9 gesteckt, 11 -13 offen:	A3 der Portadresse ist high
11 -13 gesteckt, 11 - 9 offen:	A3 der Portadresse ist low
12 -10 gesteckt, 12 -14 offen:	A2 der Portadresse ist high
12 -14 gesteckt, 12 -10 offen:	A2 der Portadresse ist low

A1 wird nicht decodiert; die Ports X+0 und X+1 sind in den Adressen
x+2 und X+3 gespiegelt.

Um kompatibel zur GRIP von Conitec zu sein, müssen die Portadressen
COh und C1h decodiert werden, dafür sind folgende Jumper zu setzen:
5-6, 7-8, 11-13, 12-14.


Der Aufbau der Karte

ist wie bei allen Bastlerlösungen etwas komplizierter als bei indu-
striell gefertigten, durchkontaktierten Karten. Wer schon mal eine
doppelseitig geätzte Karte selbst durchkontaktieren mußte, weiß ein
Lied davon zu singen. Da kann es durchaus einfacher sein, auf einem
einseitigen Board die nötigen Querverbindungen in Drahtbrücken anzu-
legen. Bei dieser Karte ist beides möglich (auch gemischt). Entweder
verwendet man die Leiterbahnen auf der Bestückungsseite direkt und
legt die nötigen Durchkontaktierungen an, oder man benutzt sie nur
als Hinweise dafür, wo Drahtbrücken gezogen werden müssen. Das Layout
der Bestückungsseite weist keine sich überkreuzenden Drahtbrücken auf
(was im Layout auch schlecht ohne Kurzschlüsse möglich ist); wo die
Leiterbahnen nicht zu eng beieinander liegen, kann auch unisoloierter
Draht verwendet werden. Bei den etwas dicker geätzten Leiterbahnen
sollte als Brücke Klingeldraht und bei den dünnen Leiterbahnen dünner
Kupferlackdraht verwendet werden (wenn man lieber Drahtbrücken legen
möchte).


Erweiterung des ECB-Interface des Hercules-Terminals auf 4 Portadres-
sen für die gesonderte Druckerausgabe

Für die gleichzeitige Ausgabe von Daten für die Console und den Drucker
über das gleiche Interface ohne besondere Unterscheidungsmöglichkeiten
des Terminals anhand irgendwelcher Statusbits lassen sich grundsätzlich
Probleme erwarten.

Es wäre möglich (wie bei der GRIP) durch ein gesetztes D7 im Datum dem
Terminal zu signalisieren, daß dieses Byte für den Drucker gedacht ist.
Damit ist aber die Möglichkeit verbaut, einen Drucker mit IBM-Zeichen-
satz 2 voll zu nutzen.

Hier soll aus der Not eine Tugend gemacht werden und die unvollständige
Decodierung des ECB-Interface auf 4 Portadressen für unterschiedliche
Ausgabeports für Console und Drucker genutzt werden. Die Ausgabe an die
Console erfolgt nach wie vor über die Adressen

  Basis + 0:  Consolen-Status (Lesen)
  Basis + 1:  Console Daten (Lesen und Schreiben)

und der Drucker ist über die Adressen

  Basis + 2:  Drucker-Status  D7=0: Ready (Lesen)
  Basis + 3:  Drucker Daten (Schreiben)

erreichbar. Physikalisch bleiben die Latches für Consolen- und
Drucker-Datenport identisch. Das Terminal kann nur anhand von D6
im Statusport des Interface erkennen, ob das Datum an die Console
oder an den Drucker ausgegeben wurde.

  D6 in Port 00h ist 0:  Datum geht an die Console
  D6 in Port 00h ist 1:  Datum geht an den Drucker

Dafür muß der Pegel von A1 des ECB-Bus bei der Ausgabe des Host an
das Terminal in einem Flip Flop gespeichert werden und der Z80 des
Terminals muß diesen Wert über einen Treiber auslesen können.

In Hardware

ist auf IC3, 74LS74 ein weiteres 74LS74 mit den Pins 7 und 14 hucke-
packs aufzulöten und auf IC4 ist ein weiteres 74LS125 mit den Pins
7(GND), 10(/IN0) und 14(+5V) huckepacks aufzulöten.

Die Pins 9 dieser beiden aufgelöteten ICs sind miteinander zu ver-
binden.

An Pin 12 des 74LS74 wird A1 des ECB-Bus (Pin 7c) gelegt.
Pin 11 des 74LS74 wird mit Pin 10 von IC11, 74LS138 (/WRDATA) ver-
bunden. Pin 8 des 74LS125 wird mit Pin 4 von IC2, 74LS374 verbun-
den (D6).

In Software

ist in das Betriebsprogramm des Terminals in der Interrupt-Service-
Routine bei Ausgaben vom Host nach der Ermittlung des Status des
ECB-Interface anhand des Pegels von D6 in Port 00h festzustellen,
ob das Byte in Port 01h an die Console (D6=0) oder an den Drucker
(D6=1) ausgegeben werden soll.




(hier sind die Grafiken HerculesTerminal08.jpg
bis HerkulesTerminal11.jpg anzuhängen)

